home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / omk82.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  4KB  |  219 lines

  1. /* --------------------------------- omk82.c -------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* object: MK82 bomb.
  8. */
  9.  
  10. #include "plane.h"
  11.  
  12.  
  13. extern int FAR
  14. BombSpeed (OBJECT *p, VECT V)
  15. {
  16.     Vcopy (V, p->V);
  17.     return (iabs(p->speed));
  18. }
  19.  
  20. extern int FAR
  21. BombIP (LVECT R, VECT V, long tz, LVECT IP)
  22. {
  23.     int    v, dt;
  24.     long    z;
  25.  
  26.     z = R[Z]-tz;
  27.     v = V[Z];
  28.     dt = v + SQRT (v*(long)v + 2L*GACC*z);
  29.  
  30.     IP[X] = R[X] + dt*(long)V[X]/GACC;
  31.     IP[Y] = R[Y] + dt*(long)V[Y]/GACC;
  32.     IP[Z] = tz;
  33.     return (muldiv (dt, 100, GACC));
  34. }
  35.  
  36. extern void FAR
  37. BombToGnd (OBJECT *p)
  38. {
  39.     int    v, a;
  40.  
  41.     v = TADJ (p->V[Z]);
  42.     if (v) {
  43.         a = fdiv ((int)p->R[Z], v);
  44.         p->R[X] -= fmul (a, TADJ (p->V[X]));
  45.         p->R[Y] -= fmul (a, TADJ (p->V[Y]));
  46.     }
  47.     p->R[Z] = 0;
  48. }
  49.  
  50. #define EX_V    (300*VONE)
  51. #define EX_A    (VD360*4)
  52.  
  53. LOCAL_FUNC int NEAR
  54. BombExplode (OBJECT *p)
  55. {
  56.     int    i;
  57.     OBJECT    *b;
  58.  
  59.     st.owner = p;
  60.     for (i = 0; i < 16; ++i) {
  61.         b = create_object (O_BROKEN, 1);
  62.         if (!b)
  63.             break;
  64.         b->flags |= F_HIT;
  65.         b->V[X] = Frand()%(EX_V+1) - EX_V/2;
  66.         b->V[Y] = Frand()%(EX_V+1) - EX_V/2;
  67.         b->V[Z] = Frand()%(EX_V+1);
  68.         b->speed = ihypot3d (b->V);
  69.         b->da[X] = Frand()%(EX_A+1) - EX_A/2;
  70.         b->da[Y] = Frand()%(EX_A+1) - EX_A/2;
  71.         b->da[Z] = Frand()%(EX_A+1) - EX_A/2;
  72.     }
  73.     create_object (O_CRATER, 1);
  74.     if (st.quiet)
  75.         Snd->Effect (EFF_MK82_EXPLODE, SND_ON);
  76.     return (i);
  77. }
  78.  
  79. static SHAPE shape_mk82 = {
  80.     0,
  81.     0,
  82.     SH_G|SH_HIT|SH_LOCALSIM,
  83.     227*1000L,    /* weight */
  84.     FONE        /* drag */
  85. };
  86.  
  87. LOCAL_FUNC int FAR
  88. create_mk82 (OBJECT *p)
  89. {
  90.     OBJECT    *owner;
  91.     E_BOMB    *b;
  92.     long    tz;
  93.  
  94.     if (!(owner = st.owner))
  95.         return (1);
  96.  
  97.     p->color = CC_WHITE;
  98.     p->time = FOREVER;
  99.     p->damage = 1;
  100.     p->damaging = 10;
  101.     p->owner = owner;
  102.     p->ownerid = owner->id;
  103.     if (IS_PLANE(owner))
  104.         ++EE(owner)->misc[11];            /* count bomb */
  105.  
  106.     LVcopy (p->R, owner->R);
  107.     Vcopy (p->V, owner->V);
  108.     Vcopy (p->a, owner->a);
  109.     Mcopy (p->T, owner->T);
  110.     p->speed = owner->speed;
  111.  
  112.     if (owner->flags & F_IMPORTED) {
  113.         p->flags |= F_IMPORTED;
  114.         p->rplayer = owner->rplayer;
  115.     } else if (T(NEW (b))) {
  116.         p->e_type = ET_BOMB;
  117.         p->extra = b;
  118.  
  119.         if (IS_PLANE(owner) &&
  120.             EE(owner)->target &&
  121.             EE(owner)->target->id == EE(owner)->tid)
  122.             tz = EE(owner)->target->R[Z];
  123.         else
  124.             tz = 0L;
  125.         b->timpact = st.present + 10L*BombIP (p->R, p->V, tz, b->IP);
  126.     }
  127.     p->flags |= F_VISIBLE|F_DONE;
  128.  
  129.     if (st.quiet)
  130.         Snd->Effect (EFF_MK82_SHOOT, SND_ON);
  131.  
  132.     if (owner == CC)
  133.         ++st.nbullets;
  134.     return (0);
  135. }
  136.  
  137. LOCAL_FUNC void FAR
  138. delete_mk82 (OBJECT *p)
  139. {
  140.     OBJECT    *owner;
  141.  
  142.     if (T(owner = p->owner) && owner->id == p->ownerid)
  143.         if (IS_PLANE(owner))
  144.             --EE(owner)->misc[11];    /* count bomb */
  145. }
  146.  
  147. LOCAL_FUNC void FAR
  148. dynamics_mk82 (OBJECT *p, int interval)
  149. {
  150.     VECT    AA;
  151.  
  152.     if (p->flags & F_HIT) {
  153.         gen_dynamics (p, interval);
  154.         return;
  155.     }
  156.     if (p->R[Z] <= 0) {
  157.         BombToGnd (p);
  158.         BombExplode (p);
  159.         p->flags |= F_DEL|F_MOD;
  160.         return;
  161.     }
  162.     AA[X] = AA[Y] = 0;
  163.     AA[Z] = -GACC;
  164. #if 0                        /* testing */
  165. {
  166.     int    vmag, q, drag;
  167.  
  168.     vmag = iabs(p->speed/VONE);
  169.     q = muldiv (vmag, vmag, 128);
  170.     drag = fmul (q, FCON(0.01));
  171.     acc = muldiv (drag, 128, 250);        /* weight = 250 Kg */
  172.  
  173.     AA[X] -= muldiv (p->V[X], p->speed, acc);
  174.     AA[Y] -= muldiv (p->V[Y], p->speed, acc);
  175.     AA[Z] -= muldiv (p->V[Z], p->speed, acc);
  176. }
  177. #else
  178. #endif
  179.  
  180.     p->V[X] += TADJ(AA[X]);
  181.     p->V[Y] += TADJ(AA[Y]);
  182.     p->V[Z] += TADJ(AA[Z]);
  183. #if 0
  184. {
  185.     ANGLE    daX;
  186.  
  187.     p->da[X] = v[Z]/64;
  188.  
  189.     daX = TADJ(p->da[X])*VONE;
  190.  
  191.     Mident (p->T);
  192.     Mrotx (p->T, daX);
  193.     fMroty (p->T, p->siny, p->cosy);
  194.     fMrotx (p->T, p->sinx, p->cosx);
  195.     fMrotz (p->T, p->sinz, p->cosz);
  196.     Mangles (p, p->T, p->a, 0);
  197. }
  198. #endif
  199.     p->speed = ihypot3d (p->V);
  200.     object_update (p, interval);
  201. }
  202.  
  203. BODY FAR BoMK82 = {
  204.     0,
  205.     0,
  206.     "MK82",
  207.     &shape_mk82,
  208.     gen_read,
  209.     gen_term,
  210.     create_mk82,
  211.     delete_mk82,
  212.     dynamics_mk82,
  213.     gen_hit
  214. };
  215.  
  216. #undef EX_V
  217. #undef EX_A
  218.  
  219.